/*
常见的API

vector():默认构造函数，创建空的vector
vector(size_type count,const T &value):创建指定大小并指定值的vector
vector(const vector &other)：				拷贝构造函数。

*/
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Person
{

public:
	string name;
	int age;
	// 构造函数，创建一个 Person 对象
	Person()
	{
		cout << "无参构造" << endl;
	}
	Person(string n, int a) : name(n), age(a)
	{
		// cout << "创建 Person: " << name << endl;
	}

	// // 拷贝构造  创建 Person 对象的副本
	// Person(const Person &other) : name(other.name), age(other.age)
	// {
	// 	cout << "拷贝 Person: " << name << endl;
	// }
	void display() const
	{
		cout << "姓名: " << name << "，年龄: " << age << endl;
	}

	//	friend ostream &operator<<(ostream &os, Person &p);
};

// ostream &operator<<(ostream &os, const Person &p)
// {
// 	os << "名字:" << p.name << "年龄" << p.age << endl;
// 	return os;
// }
int main(int argc, char const *argv[])
{
	/**********************************初始化API******************************************* */
	// vector<int> vec1;
	// cout << vec1.size() << endl;

	// 指定大小构造，创建一个包含5个元素，值为10 的vector
	// vector<int> vec2(5, 10);
	// cout << vec2.size() << endl;

	// 默认构造 创建一个空的vector<Person>显性的给出

	// 创建一个名为vec3的容器，制定大小为两个对象的

	// 指定大小构造，创建一个包含 3 个 "John" 对象的 vector
	// vector<Person> vec3(1, Person("张三", 1));
	// cout << "vec3 的大小为: " << vec3.size() << endl;
	/**********************************元素访问******************************************* */

	vector<int> vec4 = {10, 20, 30, 40, 50};
	cout << vec4.size() << endl;
	 //使用 assign 时，会清空原有内容并重新分配空间。
	 //重新分配空间 空间为3，并用20的元素填充
	vec4.assign(3, 100);
		cout << vec4.size() << "第一个元素" << vec4.front() << endl;
	 //使用at访问
	 cout << vec4.at(1) << endl;
	// 使用操作符[],下标访问
	// cout << vec4[3] << endl;
	 //访问第一个元素
	 cout << vec4.front() << endl;
	 cout << *(vec4.begin()) << endl;
	// 逆向访问 从右到左依次增大,要想访问右边的元素
	 cout << *(vec4.rend() - 1) << endl;
	// 访问最后一个元素
	 cout << vec4.back() << endl;
	 cout << *(vec4.end() - 1) << endl;
	 cout << *(vec4.rbegin()) << endl;
	 //获取数据指针  打印第二个元素 一定要分清前置++ 和后置++
	 int *data_ptr = vec4.data();
	 cout << *(++data_ptr) << endl;

	// 自定义性类型元素访问
	// 创建并初始化一个包含Person对象的vector
	vector<Person> vec5 = {Person("Alice", 25),
						   Person("Bob", 30),
						   Person("Charlie", 35)};
	// vec5.at(1).display();
	// vec5.front().display();
	// Person p1("Charlie", 35);
	// cout << p1;
	/**********************************迭代器******************************************* */
	/// 迭代器   相当于指针  ==作用==用来遍历容器或者遍历修改容器的值
	// cout << "正向遍历" << endl;
	// for (vector<int>::iterator it = vec4.begin(); it != vec4.end(); it++)
	// {

	// 	cout << *it << endl;
	// }

	// cout << "反向打印" << endl;

	// for (vector<Person>::iterator it = vec5.begin(); it != vec5.end(); it++)
	// {
	// 	Person temp = *it;
	// 	cout << "性名：" << temp.name << "\t年龄" << temp.age << endl;
	// }
	/**********************************容量管理******************************************* */
	// empty、size、max_size、capacity、reserve、shrink_to_fit
	// 当 size 达到 capacity 时，vector 会自动扩展其容量，通常是当前容量的两倍。
	// 1.检查容量是否为空
	// cout << vec4.empty() << endl;
	// 2.元素的数量
	// cout << vec5.size() << endl;

	// 检查容器是否为空
	// cout << "容器是否为空：" << (vec4.empty() ? "是" : "否") << endl;
	// cout << vec4.capacity() << endl;
	// 返回容器当前分配的存储空间大小（即容量）。
	// vec4.push_back(1);
	// cout << "添加元素后，size: " << vec4.size() << "，capacity: " << vec4.capacity() << endl;

	// 预留容量  reserve() 只是预留空间，不会影响 size()，但会改变 capacity()。
	// vec4.reserve(14);
	// cout << "预留容量后，size: " << vec4.size() << "，capacity: " << vec4.capacity() << endl;

	/**********************************修改操作******************************************* */
	// clear、insert、erase、push_back、pop_back、resize、swap

	vector<int> vec6 = {1, 2, 3, 4, 5, 6};
	vec6.insert(vec6.begin() + 1, 10);
	for (vector<int>::iterator it = vec6.begin(); it != vec6.end(); it++)
	{

		cout << *it << endl;
	}

	vec6.erase(vec6.begin() + 4);
	for (vector<int>::iterator it = vec6.begin(); it != vec6.end(); it++)
	{

		cout << *it << endl;
	}

	// for (vector<int>::iterator it = vec6.rbegin(); it != vec6.rend(), it++)
	// {

		return 0;
	}
